package com.yohann.user_service.controller;

import com.yohann.user_service.entity.User;
import com.yohann.user_service.entity.vo.RegisterVo;
import com.yohann.user_service.service.UserService;
import com.yohann.utils.jwt.JwtUtils;
import com.yohann.utils.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author Yohann
 * @since 2020-10-29
 */
@Api(tags = "用户")
@RestController
@RequestMapping("/user_service")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 登录
     *
     * @param user 用户信息
     * @return token
     */
    @ApiOperation("登录")
    @PostMapping("login")
    public Result login(@ApiParam("用户信息") @RequestBody User user) {
        String token = userService.login(user);

        return Result.ok().data("token", token);
    }

    /**
     * 登录
     *
     * @param phone    手机号
     * @param password 密码
     * @return 用户id
     */
    @ApiOperation("登录")
    @GetMapping("login/{phone}/{password}")
    public Result login(@PathVariable("phone") String phone, @PathVariable("password") String password) {
        Integer id = userService.login(phone, password);

        return Result.ok().data("id", id);
    }

    /**
     * 注册账号
     *
     * @param registerVo 注册信息
     * @return 注册状态
     */
    @ApiOperation("注册账号")
    @PostMapping("register")
    public Result register(@ApiParam("注册信息") @RequestBody RegisterVo registerVo) {
        userService.register(registerVo);

        return Result.ok();
    }

    /**
     * 修改用户信息
     *
     * @param user 用户信息
     * @return 修改状态
     */
    @ApiOperation("修改用户信息")
    @PostMapping("updateUser")
    public Result updateUser(@ApiParam("用户信息") @RequestBody User user) {
        boolean update = userService.updateById(user);

        return Result.state(update);
    }

    /**
     * 通过token获取用户信息
     *
     * @param request request信息
     * @return 用户信息
     */
    @ApiOperation("通过token获取用户信息")
    @GetMapping("getUserInfoByToken")
    public Result getUserInfo(HttpServletRequest request) {
        //通过token获取id
        String id = JwtUtils.getUserId(request);

        //通过id获取用户信息
        User user = userService.getById(id);

        if (user == null) {
            return Result.error().code(20003).message("请先登录！");
        }

        return Result.ok().data("userInfo", user);
    }

    /**
     * 通过id获取用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    @ApiOperation("通过id获取用户信息")
    @GetMapping("getUserInfo/{id}")
    public Result getUserInfo(@ApiParam("用户id") @PathVariable int id) {
        User user = userService.getById(id);

        return Result.ok().data("user", user);
    }

    /**
     * 通过id获取用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    @ApiOperation("通过id获取用户信息")
    @GetMapping("getUser/{id}")
    public User getUser(@ApiParam("用户id") @PathVariable int id) {
        return userService.getById(id);
    }

    /**
     * 分页查询用户信息
     *
     * @param current 起始位置
     * @param limit   结束位置
     * @param user    查询条件
     * @return 结果集
     */
    @ApiOperation("分页查询用户信息")
    @PostMapping("getUser/{current}/{limit}")
    public Result pageQueryUser(@ApiParam("起始位置") @PathVariable int current,
                                @ApiParam("结束位置") @PathVariable int limit,
                                @ApiParam("查询条件") @RequestBody(required = false) User user) {
        Map<String, Object> map = userService.pageQueryUser(current, limit, user);

        return Result.ok().data(map);
    }

    /**
     * 管理员登录
     *
     * @param user 账号密码
     * @return token
     */
    @ApiOperation("管理员登录")
    @PostMapping("login/super")
    public Result loginSuper(@ApiParam("账号密码") @RequestBody User user) {
        String token = userService.loginSuper(user);

        return Result.ok().data("token", token);
    }

    @GetMapping("info")
    public Result info() {
        return Result.ok()
                .data("roles", "上帝")
                .data("name", "Yohann")
                .data("avatar", "https://rice-college.oss-cn-shenzhen.aliyuncs.com/2020/11/28/29492b8f7c8f422c8301be82776681ee.jpg");
    }

    @GetMapping("logout")
    public Result logout() {
        return Result.ok();
    }
}

